package com.zhuzg.advice;

import com.zhuzg.domain.AjaxResult;
import com.zhuzg.exception.MesException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import java.util.List;

/**
 *   面试问题： 你们项目是如何进行异常处理的（如何统一异常处理的）？
 *   1. 创建一个全局的GlobalExceptionHandler，在这个上边使用RestControllerAdvice注解进行修饰
 *   2. 这个类中编写方法，方法上边使用ExceptionHandler 注解进行修饰,参数指定遇见什么样的异常的时候执行此方法
 *   3. 实际上这个就是Spring 当中Aop的一个典型的应用
 *
 */
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public AjaxResult MyException(Exception e ){
        e.printStackTrace();
        System.out.println("异常被拦截了");
        return AjaxResult.error(MesException.ERR_CODE_PARAM,e.getMessage());
    }

    @ExceptionHandler(MesException.class)
    public AjaxResult MesExceptionHandler(MesException e ){
        System.out.println("异常被拦截了");
        return AjaxResult.error(MesException.ERR_CODE_FILE_NOEXIT,e.getMessage());
    }

    /**
     * 参数错误统一拦截
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public AjaxResult paramException(MethodArgumentNotValidException e){
        BindingResult result = e.getBindingResult();

        // 获取到所有的错误
        List<FieldError> fieldErrors = result.getFieldErrors();
        return AjaxResult.error("408","参数校验错误", fieldErrors);
    }

}
